home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 11 / Cream of the Crop 11-1.iso / sound / sbplay25.zip / SOURCE.ZIP / ems.c < prev    next >
C/C++ Source or Header  |  1995-12-06  |  3KB  |  179 lines

  1. /* EMS Library for Microsoft Quick C with Assembler   */
  2. /* John A. Ball         October 9, 1995               */
  3.  
  4. #include <EMS.h>
  5. #include <dos.h>
  6. #include <io.h>
  7. #include <fcntl.h>
  8. #include <memory.h>
  9.  
  10.  
  11. static unsigned EMM_in_memory,
  12.         EMM_version,
  13.         EMM_top_page;
  14. static int      EMM_handle=-1;
  15.  
  16. /* find Expanded Memory Manager using device open method.  */
  17. /* If not found return 0 else version number in BCD format */
  18.  
  19. int EMM_find_manager()
  20. {
  21. int     file_handle;
  22. int     result;
  23.  
  24.     if(EMM_version) return EMM_version;     /* skip if already known */
  25.     if((file_handle=open("EMMXXXX0", O_RDONLY))==0)
  26.        return 0;
  27.     _asm{
  28.         mov bx,file_handle  ;handle of file or device
  29.         mov ax,4400h        ;Get Device Data
  30.         int 21h
  31.         jc error
  32.         mov ax,dx           ;get device status bit 7
  33.         and ax,0x80
  34.         je error
  35.         mov bx,file_handle  ;handle of file or device
  36.         mov ax,4407h        ;Check device output status
  37.         int 21h
  38.         jc error
  39.         cmp al,0ffh         ;0ffh means device ready
  40.         jne error
  41.         mov ax,1
  42.         jmp end
  43.     error:
  44.         mov ax,0
  45.     end:
  46.         mov result,ax
  47.         }
  48.     if(result){
  49.        EMM_in_memory=1;
  50.        result=EMM_version=EMM_get_version();
  51.        }
  52.     close(file_handle);
  53.     return result;
  54. }
  55.  
  56. /* GET EMM version */
  57.  
  58. int EMM_get_version()
  59. {
  60.     if(!EMM_in_memory) return 0;
  61.     _asm{
  62.     mov ah,0x46
  63.     int 67h
  64.     }
  65. }
  66.  
  67. /* Get EMM Status */
  68.  
  69. int EMM_get_status()
  70. {
  71.     if(!EMM_in_memory) return 0x80;
  72.     _asm{
  73.     mov ah,0x40
  74.     int 67h
  75.     }
  76. }
  77.  
  78. /* Get EMM page frame */
  79.  
  80. void _far *EMM_get_page_frame()
  81. {
  82.     if(!EMM_in_memory) return (void far *)0;
  83.     _asm{
  84.     mov ah,0x41
  85.     int 67h
  86.     or ah,ah
  87.     jnz frame_error
  88.     mov dx,bx
  89.     jmp frame_end
  90.     frame_error:
  91.     mov ax,0
  92.     mov dx,ax
  93.     frame_end:
  94.     }
  95. }
  96.  
  97. /* Get total number of EM pages */
  98.  
  99. int EMM_get_pages()
  100. {
  101.     if(!EMM_in_memory) return 0x80;
  102.     _asm{
  103.     mov ah,0x42
  104.     int 67h
  105.     or ah,ah
  106.     jnz get_error
  107.     mov ax,dx
  108.     get_error:
  109.     }
  110. }
  111.  
  112. /* Get number of EM pages free */
  113.  
  114. int EMM_get_pages_free()
  115. {
  116.     if(!EMM_in_memory) return 0x80;
  117.     _asm{
  118.     mov ah,0x42
  119.     int 67h
  120.     or ah,ah
  121.     jnz getp_error
  122.     mov ax,bx
  123.     getp_error:
  124.     }
  125. }
  126.  
  127.  
  128. /* Allocate EMM pages */
  129.  
  130. int EMM_alloc_pages(int pages)
  131. {
  132.     if(!EMM_in_memory) return 0x80;
  133.     _asm{
  134.     mov ah,0x43
  135.     mov bx,pages
  136.     int 67h
  137.     or ah,ah
  138.     jnz alloc_error
  139.     mov EMM_handle,dx
  140.     mov ax,0
  141.     alloc_error:
  142.     }
  143. }
  144.  
  145. /* Map memory */
  146.  
  147. int EMM_map_page(int phys_page, int logical_page)
  148. {
  149.     if(!EMM_in_memory) return 0x80;
  150.     _asm{
  151.     mov ah,0x44
  152.     mov al,phys_page
  153.     mov bx,logical_page
  154.     mov dx,EMM_handle
  155.     int 67h
  156.     or ah,ah
  157.     jnz map_error
  158.     mov ax,0
  159.     map_error:
  160.     }
  161. }
  162.  
  163. /* Release handle and memory */
  164.  
  165. int EMM_release_pages(void)
  166. {
  167.     if(!EMM_in_memory) return 0x80;
  168.     _asm{
  169.     mov ah,0x45
  170.     mov dx,EMM_handle
  171.     int 67h
  172.     or ah,ah
  173.     jnz release_error
  174.     mov ax,0
  175.     mov EMM_handle,ax
  176.     release_error:
  177.     }
  178. }
  179.